package cn.tedu.aop.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
 * @Aspect 描述的类，为切面类型，这个类型可以定义切入点和通知方法
 */
@Order(10)
@Aspect
@Component
public class LogAspect {
    //org.slf4j.Logger
    private static final Logger log= LoggerFactory.getLogger(LogAspect.class);
    //定义通知方法
    /**
     * @Around通知方法：这样的方法中写对目标业务对象的调用以及扩展业务逻辑
     * bean(*ServiceImpl) 表达式为一个粗粒度的切入点表达式,表示ServiceImpl结尾
     * 的所有bean对象中的方法，都是切入点方法，都是要进行功能增强方法。
     * @param joinPoint 连接点对象，封装了要执行的目标业务对象方法
     * @return
     * @throws Throwable
     */
    //@Around("bean(*ServiceImpl)")
    //@Around("within(cn.tedu.aop.article.service.impl.*)")
    //@Around("@annotation(cn.tedu.aop.base.annotation.RequiredLog)")
    //@Around("execution(* cn.tedu.aop.article.service.impl.*.*(Long[],..))")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("log.aspect.around.before");
        long t1=System.currentTimeMillis();
        Object result = joinPoint.proceed();//调用目标业务对象
        long t2=System.currentTimeMillis();
        log.info("耗时：{}",t2-t1);
        return result;
    }
}
